/**
 * 预加载工具
 * @description 用于在用户悬停时预加载可能访问的页面，提升用户体验和页面切换速度
 * @author 系统开发团队
 * @version 1.0.0
 */

// ==================== 预加载管理器类 ====================

/**
 * 预加载管理器类
 * @description 管理页面组件的预加载，支持智能预加载队列和性能优化
 */
class PreloadManager {
    /** 已预加载的路由集合，避免重复预加载 */
    private preloadedRoutes: Set<string> = new Set()
    /** 预加载队列，存储待预加载的路由 */
    private preloadQueue: string[] = []

    /**
     * 预加载路由
     * @description 将路由添加到预加载队列，在浏览器空闲时执行预加载
     * @param {string} routeName 路由名称
     * @example
     * preloadManager.preloadRoute('blog')
     */
    preloadRoute(routeName: string) {
        // 如果已经预加载过，直接返回
        if (this.preloadedRoutes.has(routeName)) {
            return
        }

        // 添加到已预加载集合和队列
        this.preloadedRoutes.add(routeName)
        this.preloadQueue.push(routeName)

        // 使用 requestIdleCallback 在浏览器空闲时预加载
        if ('requestIdleCallback' in window) {
            requestIdleCallback(() => {
                this.executePreload()
            })
        } else {
            // 降级处理：使用setTimeout
            setTimeout(() => {
                this.executePreload()
            }, 100)
        }
    }

    /**
     * 执行预加载
     * @description 从队列中取出路由并执行实际的组件预加载
     * @private
     */
    private executePreload() {
        const routeName = this.preloadQueue.shift()
        if (!routeName) return

        try {
            // 根据路由名称预加载对应的组件
            switch (routeName) {
                case 'blog':
                    import('../views/Blog.vue')
                    break
                case 'about':
                    import('../views/About.vue')
                    break
                case 'timeline':
                    import('../views/Timeline.vue')
                    break
                case 'guestbook':
                    import('../views/Guestbook.vue')
                    break
                case 'friends':
                    import('../views/Friends.vue')
                    break
                case 'login':
                    import('../views/Login.vue')
                    break
                case 'register':
                    import('../views/Register.vue')
                    break
                default:
                    break
            }

            console.log(`✅ 预加载完成: ${routeName}`)
        } catch (error) {
            console.warn(`❌ 预加载失败: ${routeName}`, error)
        }
    }

    /**
     * 为导航链接添加预加载
     * @description 为指定的HTML元素添加鼠标悬停预加载功能
     * @param {HTMLElement} element 需要添加预加载的HTML元素
     * @param {string} routeName 对应的路由名称
     * @example
     * const navLink = document.querySelector('.nav-link')
     * preloadManager.addPreloadToElement(navLink, 'blog')
     */
    addPreloadToElement(element: HTMLElement, routeName: string) {
        element.addEventListener('mouseenter', () => {
            this.preloadRoute(routeName)
        })
    }

    /**
     * 批量添加预加载
     * @description 为多个元素批量添加预加载功能
     * @param {Array<{element: HTMLElement, routeName: string}>} elements 元素和路由名称的映射数组
     * @example
     * preloadManager.addBatchPreload([
     *   { element: document.querySelector('.blog-link'), routeName: 'blog' },
     *   { element: document.querySelector('.about-link'), routeName: 'about' }
     * ])
     */
    addBatchPreload(elements: Array<{ element: HTMLElement; routeName: string }>) {
        elements.forEach(({ element, routeName }) => {
            this.addPreloadToElement(element, routeName)
        })
    }

    /**
     * 获取预加载统计信息
     * @description 返回预加载的统计信息，包括已预加载数量、路由列表和队列长度
     * @returns {object} 预加载统计信息
     * @example
     * const stats = preloadManager.getPreloadStats()
     * console.log('已预加载路由数量:', stats.preloadedCount)
     * console.log('预加载队列长度:', stats.queueLength)
     */
    getPreloadStats() {
        return {
            preloadedCount: this.preloadedRoutes.size,
            preloadedRoutes: Array.from(this.preloadedRoutes),
            queueLength: this.preloadQueue.length
        }
    }
}

// ==================== 全局实例和工具函数 ====================

/** 全局预加载管理器实例 */
export const preloadManager = new PreloadManager()

/**
 * 为导航链接设置预加载
 * @description 自动查找页面中的导航链接并为它们添加预加载功能
 * @example
 * setupPreloadForNavigation()
 */
export function setupPreloadForNavigation() {
    // 等待 DOM 加载完成
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', setupPreloadForNavigation)
        return
    }

    // 查找所有带有href属性的链接
    const navLinks = document.querySelectorAll('a[href]')
    navLinks.forEach(link => {
        const href = link.getAttribute('href')
        if (href && href.startsWith('/')) {
            // 提取路由名称（去掉开头的斜杠）
            const routeName = href.slice(1) || 'home'
            preloadManager.addPreloadToElement(link as HTMLElement, routeName)
        }
    })
}

// ==================== 自动初始化 ====================

/**
 * 自动初始化预加载功能
 * @description 在浏览器环境中自动启动预加载功能
 */
if (typeof window !== 'undefined') {
    setupPreloadForNavigation()
} 